%
%~~
%~~  Descricao Informal
%~~
%
\chapter{Comentários}
\label{04:chp:comentarios}

Para representação dos autômatos em tempo de compilação, criaram-se quatro matrizes de transições de estados, sendo uma para cada autômato. Cada linha dessas matrizes  apresenta três colunas que possuem o estado atual, o token recebido e o próximo estado respectivamente. Como as matrizes criadas são do tipo inteiro, foi necessário transformar o token, composto de classe e valor, em um código que o representasse na tabela. Para isso, a cada recebimento de um novo token, gera-se o código concatenando-se a classe com o valor, dessa forma, se a classe é 403 (caracteres especiais) e o valor é 125 ('\}') o código correspondente gerado será 403125.

Como as tabelas possuem transições que chamam outras sub-máquinas também se fez necessária a representação dessas sub-máquinas através de inteiros negativos na tabela. Para melhor visualização e entendimento, no código foram utilizados defines para representar os códigos das sub-máquinas através dos lexemas PROGRAMA, CODIGO, EXPARIT, EXPLOG e NUMERO. Assim, quando não encontra-se uma transição para o token recebido na sub-máquina atual, tenta-se a sua análise na outra sub-máquina, caso o estado em que se encontra o cursor possua uma chamada de sub-máquina.

Para o empilhar e desempilhar os estados de retorno criou-se uma estrutura com o nome "PilhaAPE" que é responsável pela representação dos itens empilhados do autômato de pilha estruturado. A pilha é utilizada sempre que ocorre uma transição da análise para uma outra submáquina, ou quando chega-se ao fim de uma sub-máquina no seu estado de aceitação, o que indica o retorno para uma sub-máquina anterior.

Outro comentário importante é a relatar a existência de um não determinismo nos autômatos gerados, por conta de possibilidades de uma variável poder receber uma chamada de função (que possui um identificador), ou uma expressão aritmética (que pode se utilizar de identificadores de outras variáveis). 

\pagebreak 
Exemplo:

\begin{verbatim} 
int variavel = funcao(); // recebe chamada de função com identificador
int variavel2 = variavel + variavel; // recebe expressão aritmética 
                                        através de identificadores
\end{verbatim}

Para o tratamento, considera-se, no caso de recebimento de um identificador, que o mesmo é sempre a chamada de uma função. Caso a análise não funcione, retorna-se o autômato no estado anterior da análise e tenta-se na sub-máquina de expressão aritmética. Esse não determinismo só acontece no autômato de comando, sendo bem fácil a identificação dos estados em que este ocorre e o tratamento das ocorrências.

Funções de buscas adicionais foram implementadas para auxiliar na navegação pelas matrizes representantes das tabelas de transições de estados. Nomais o analisador sintático funciona exatamente como um autômato de pilha estruturado, conforme as especificações, imprimindo  "TODO$\backslash$n"
 sempre que ocorre o consumo de token e transição de estado e fornecendo uma mensagem de sucesso ou falha dependendo do resultado da análise.
